package com.engine.salary.service;

import com.engine.salary.common.LocalDateRange;
import com.engine.salary.entity.salaryacct.param.SalaryAcctRecordQueryParam;
import com.engine.salary.entity.salaryacct.param.SalaryAcctRecordSaveParam;
import com.engine.salary.entity.salaryacct.po.SalaryAcctRecordPO;
import com.engine.salary.entity.salaryacct.po.SalaryAcctResultPO;
import com.engine.salary.entity.salarysob.dto.SalarySobCycleDTO;
import com.engine.salary.enums.salaryaccounting.SalaryAcctRecordStatusEnum;
import com.engine.salary.util.page.PageInfo;

import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * 薪资核算记录
 * <p>Copyright: Copyright (c) 2022</p>
 * <p>Company: 泛微软件</p>
 *
 * @author qiantao
 * @version 1.0
 **/
public interface SalaryAcctRecordService {

    /**
     * 根据主键id获取单条薪资核算记录
     *
     * @param id        主键id
     * @return
     */
    SalaryAcctRecordPO getById(Long id);

    List<SalaryAcctRecordPO> listAll();

    /**
     * 根据主键id查询薪资核算记录
     *
     * @param ids       主键id
     * @return
     */
    List<SalaryAcctRecordPO> listByIds(Collection<Long> ids);

    /**
     * 根据薪资账套id、薪资所属月查询薪资核算记录
     *
     * @param salarySobIds         薪资账套id
     * @param salaryMonthDateRange 薪资所属月的时间范围
     * @return
     */
    List<SalaryAcctRecordPO> listBySalarySobIdsAndSalaryMonth(Collection<Long> salarySobIds, LocalDateRange salaryMonthDateRange);

    /**
     * 根据薪资账套id、税款所属期查询薪资核算记录
     *
     * @param salarySobIds      薪资账套id
     * @param taxCycleDateRange 税款所属期的时间范围
     * @return
     */
    List<SalaryAcctRecordPO> listBySalarySobIdsAndTaxCycle(Collection<Long> salarySobIds, LocalDateRange taxCycleDateRange);

    /**
     * 根据薪资所属月查询薪资核算记录
     *
     * @param salaryMonthDateRange 薪资所属月的时间范围
     * @return
     */
    List<SalaryAcctRecordPO> listBySalaryMonth(LocalDateRange salaryMonthDateRange);

    /**
     * 根据税款周期查询薪资核算记录
     *
     * @param salaryMonthDateRange
     * @return
     */
    List<SalaryAcctRecordPO> listByTaxCycle(LocalDateRange salaryMonthDateRange,Collection<Long> salarySobIds);

    /**
     * 根据列表查询条件查询薪资核算记录（分页）
     *
     * @param queryParam 列表查询条件
     * @return
     */
    PageInfo<SalaryAcctRecordPO> listPageByParam(SalaryAcctRecordQueryParam queryParam);

    /**
     * 根据id查询同一个账套上一个月的薪资核算记录
     *
     * @param id        薪资核算记录id
     * @return
     */
    List<SalaryAcctRecordPO> listById4LastSalaryMonth(Long id);

    /**
     * 根据薪资账套ID查询薪资核算记录
     *
     * @param salarySobIds 薪资账套id
     * @return
     */
    List<SalaryAcctRecordPO> listBySalarySobIds(Collection<Long> salarySobIds);

    /**
     * 根据id查询其他合并计税的薪资核算记录
     *
     * @param id        薪资核算记录的id
     * @return
     */
    List<SalaryAcctRecordPO> listById4OtherConsolidatedTax(Long id);

    /**
     * 薪资核算记录所用的薪资账套薪资周期、考勤周期……
     *
     * @param id        薪资核算记录的id
     * @return
     */
    SalarySobCycleDTO getSalarySobCycleById(Long id);

    /**
     * 保存
     *
     * @param saveParam  保存参数
     * @return
     */
    Long save(SalaryAcctRecordSaveParam saveParam);

    /**
     * 更新薪资核算记录的状态
     *
     * @param ids       主键id
     * @param status    薪资核算记录的状态
     */
    void updateStatusByIds(Collection<Long> ids, SalaryAcctRecordStatusEnum status);

    /**
     * 根据主键id删除
     *
     * @param ids       薪资核算记录的id
     */
    void deleteByIds(Collection<Long> ids);

    /**
     * 归档
     *
     * @param id         薪资核算记录的id
     */
    void file(Long id);

    /**
     * 重新核算（并不是重新执行公式，而是变更薪资核算记录状态为未归档，并且撤回生成的工资单）
     *
     * @param id         薪资核算记录的id
     */
    void reCalculate(Long id);

    /**
     * 判断是否存在合并计税
     *
     * @param id        薪资核算记录的id
     * @return 0：不存在、1：存在
     */
    Integer hasConsolidatedTax(Long id);

    /**
     * 查询操作日志中的操作对象名称
     *
     * @param id        薪资核算记录的id
     * @return
     */
    String getLogTargetNameById(Long id);

    /**
     * 根据状态查询薪资核算记录
     *
     * @param status
     * @return
     */
    List<SalaryAcctRecordPO> listByStatus(SalaryAcctRecordStatusEnum status);

    /**
     * 根据核算人和核算状态查询核算记录
     *
     * @param status
     * @param employeeId
     * @return
     */
    List<SalaryAcctRecordPO> listByStatusAndEmployeeId(SalaryAcctRecordStatusEnum status, Long employeeId);

    void updateLockSalaryItemIds(SalaryAcctRecordPO salaryAcctRecord);

    /**
     * @description 回算
     * @return void
     * @author Harryxzy
     * @date 2022/11/24 16:09
     */
    void backCalculate(Long salaryAcctRecordId);

    /**
     * @description 获取是回算的薪资核算
     * @return List<SalaryAecordPO>
     * @author Harryxzy
     * @date 2022/12/19 9:05
     */
    List<SalaryAcctRecordPO> getBackCalcRecordByIds(Set<Long> salaryAcctIds);

    List<SalaryAcctResultPO> listBySalaryAcctEmpId(Long salaryAcctEmpId);


    List<SalaryAcctRecordPO> listSome(SalaryAcctRecordPO po);

    void updateDate(Long id, Date updateTime);
}
